﻿// =============================================
// 文件保护宏：防止该头文件被重复包含（避免编译错误）
// 如果尚未定义 CUSTOM_LIGHT_INCLUDED，则定义它并继续，否则跳过
// =============================================
#ifndef CUSTOM_LIGHT_INCLUDED
#define CUSTOM_LIGHT_INCLUDED

// =============================================
// 定义一个宏：MAX_DIRECTIONAL_LIGHT_COUNT
// 表示该 Shader / 渲染管线中最多支持 4 个定向光源（比如远处的太阳光）
// 这是一个人为限制，可以根据需求调整（比如 1~8 个）
// =============================================
#define MAX_DIRECTIONAL_LIGHT_COUNT 4

// =============================================
// 开始定义一个 Unity 支持的常量缓冲区（Constant Buffer），名称为 _CustomLight
// 在 Unity SRP 中，使用 CBUFFER_START / CBUFFER_END 宏包裹的变量
// 会被打包进 GPU 的常量缓冲区，用于高效传递渲染数据（比如光源、材质参数等）
// 这里的缓冲区命名为 _CustomLight，是自定义的命名，通常与渲染管线中设置的名称一致
// =============================================
CBUFFER_START(_CustomLight)

	// _DirectionalLightCount：当前场景中有效的定向光源数量，取值范围 [0, MAX_DIRECTIONAL_LIGHT_COUNT]
	// 类型为 int，由渲染管线在运行时设置
	int _DirectionalLightCount;

	// _DirectionalLightColors：定向光源的颜色数组
	// 每个元素是一个 float4，其中 rgb 通道表示光源颜色，a 通道通常未使用
	// 数组长度为 MAX_DIRECTIONAL_LIGHT_COUNT，即最多 4 个光源
	float4 _DirectionalLightColors[MAX_DIRECTIONAL_LIGHT_COUNT];

	// _DirectionalLightDirections：定向光源的方向数组
	// 每个元素是一个 float4，其中 xyz 表示光源的**朝向（方向）向量**，一般是从表面指向光源（或反之，但要统一约定）
	// 数组长度同样是 MAX_DIRECTIONAL_LIGHT_COUNT
	float4 _DirectionalLightDirections[MAX_DIRECTIONAL_LIGHT_COUNT];

// =============================================
// 结束常量缓冲区的定义
// =============================================
CBUFFER_END

// =============================================
// 定义一个简单的 Light 结构体，用于在 Shader 中表示单个光源的信息
// 包括：
// - color：光源颜色（RGB，通常已预乘强度，比如白色太阳光为 (1,1,1)）
// - direction：光源方向（单位向量，通常指向光源，或从光源指向表面，需与光照公式一致）
// =============================================
struct Light {
	float3 color;     // 光源颜色（RGB）
	float3 direction; // 光源方向（单位向量）
};

// =============================================
// 函数：GetDirectionalLightCount
// 作用：返回当前场景中有效的定向光源数量
// 该数值由渲染管线在运行时设置到 _DirectionalLightCount 变量中
// =============================================
int GetDirectionalLightCount() {
	return _DirectionalLightCount;
}

// =============================================
// 函数：GetDirectionalLight
// 作用：根据索引 index（从 0 开始），获取对应的定向光源信息
// 返回一个 Light 结构体，包含该光源的 color 和 direction
// 注意：index 必须在 [0, GetDirectionalLightCount() - 1] 范围内，否则可能越界
// =============================================
Light GetDirectionalLight(int index) {
	Light light;
	// 从常量缓冲区中获取该索引光源的颜色（取 rgb，忽略 a）
	light.color = _DirectionalLightColors[index].rgb;
	// 从常量缓冲区中获取该索引光源的方向向量（取 xyz，忽略 w）
	light.direction = _DirectionalLightDirections[index].xyz;
	return light;
}

// =============================================
// 文件保护宏结束
// =============================================
#endif